#include<iostream>
#include <sys/socket.h>  // 用于 socket() 函数
#include <netinet/in.h>  // 用于 sockaddr_in 结构体
#include <arpa/inet.h>   // 用于地址转换函数
#include <unistd.h>      // 用于 close() 函数
#include <cstring>       // 用于 memset() 函数

class UdpServer
{
public:
    UdpServer(std::string ip,uint16_t port):_ip(ip),_port(port),_sockfd(-1)
    {

    }
    bool InitServer()
    {
        //1.创建套接字
        _sockfd=socket(AF_INET,SOCK_DGRAM,0);
        if(_sockfd<0)
        {
            perror("socket error");
            return false;
        }
        std::cout<<"socket create sucess, sockfd: "<<_sockfd<<std::endl;

        struct sockaddr_in local;
        memset(&local, '\0', sizeof(local));
        local.sin_family=AF_INET;
        local.sin_addr.s_addr=inet_addr(_ip.c_str());
        local.sin_port=htons(_port);
        //2.绑定地址信息
        if(bind(_sockfd,(struct sockaddr*)&local,sizeof(local))<0)
        {
            perror("bind error");
            return false;
        }
        std::cout<<"bind sucess"<<std::endl;
        return true;
    }

    
    ~UdpServer()
    {
        if(_sockfd>=0)
        {
            close(_sockfd);
        }
    }
private:
    std::string _ip;
    uint16_t _port;
    int _sockfd;
};

int main()
{
    UdpServer us("111.111.111.111",2222);
    us.InitServer();
    return 0;
}